package com.ellwood.copyright.modules.softConf.logic;

import com.alibaba.druid.pool.DruidDataSource;
import com.ellwood.copyright.infrastructure.softConf.dto.CommonFields;
import com.ellwood.copyright.infrastructure.softConf.dto.FieldInfoDTO;
import com.ellwood.copyright.infrastructure.softConf.dto.TableInfoDTO;
import lombok.extern.slf4j.Slf4j;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

/**
 * @ProjectName: ell-copyright-pro
 * @PackageName: com.ellwood.copyright.modules.softConf.logic
 * @ClassName: TableValidateLogic
 * @Description: // 业务数据处理
 * @Author: Ellwood
 * @CreateDate: 2024/11/20 - 22:49
 * @Version: V1.0.0
 */


@Slf4j
public class TableValidateLogic {

    /**
     * 表明和字段名验证
     * @param tableName 表名
     * @param fields 字段名信息
     */
    public static void validateInput(String tableName, List<FieldInfoDTO> fields){
        if (!tableName.matches("[a-zA-Z_][a-zA-Z0-9_]*")) {
            throw new IllegalArgumentException("无效的表名==" + tableName);
        }

        fields.forEach(field->{
            if (!field.getFieldName().matches("[a-zA-Z_][a-zA-Z0-9_]*")) {
                throw new IllegalArgumentException("无效的字段名=="+field.getFieldName());
            }
        });
    }

    /**
     * 生成sql
     * @param tableDTO 表dto4
     */
    public static void generateTable(TableInfoDTO tableDTO, DataSource dataSource){
        // 生成表结构
        StringBuilder createTableSQL = new StringBuilder();
        createTableSQL.append("CREATE TABLE IF NOT EXISTS "+ tableDTO.getTableName() + " (");

        // 主键标识
        String primaryKeySQL = "";

        // 遍历字段并生成每个字段的sql
        for (int i=0; i<tableDTO.getFields().size(); i++) {
            FieldInfoDTO field = tableDTO.getFields().get(i);

            // 判断主键字段
            if (field.getIsPrimaryKey()!=null&&field.getIsPrimaryKey()) {
                // 有主键
                field.setFieldType("BIGINT"); // 设置主键字段类型为BIGINT
                if (field.getIsAutoIncrement()==null||field.getIsAutoIncrement()) {
                    createTableSQL.append(field.getFieldName()).append(" ")
                            .append(field.getFieldType())
                            .append(" NOT NULL AUTO_INCREMENT");
                    primaryKeySQL="PRIMARY KEY ("+field.getFieldName()+")";
                }else{
                    createTableSQL.append(field.getFieldName())
                            .append(" ").append(field.getFieldType()).append(" NOT NULL ");
                }
            }else{
                // 其他字段
                // 判断是否是枚举字段
                if (Boolean.TRUE.equals(field.getIsEnum())) {
                    // 枚举字段
                    createTableSQL.append(field.getFieldName()).append(" ")
                            .append("TINYINT") // 枚举类型使用 tinyint
                            .append(field.getIsNullable() != null && field.getIsNullable() ? " NULL" : " NOT NULL");

                    // 如果存在默认值，才添加 default 子句
                    if (field.getDefaultValue() != null && !field.getDefaultValue().isEmpty()) {
                        createTableSQL.append(" DEFAULT ").append(field.getDefaultValue());
                    }
                }else{
                    createTableSQL.append(field.getFieldName()).append(" ")
                            .append(field.getFieldType())
                            .append(field.getIsNullable() != null && field.getIsNullable() ? " NULL" : " NOT NULL");

                    // 如果存在默认值，才添加default子句
                    if (field.getDefaultValue() != null && !field.getDefaultValue().isEmpty()) {
                        createTableSQL.append(" DEFAULT ").append(field.getDefaultValue());
                    }
                }

            }

            // 添加字段的 COMMENT
            if (field.getFieldDescription()!=null&&!field.getFieldDescription().isEmpty()) {
                createTableSQL.append(" COMMENT '").append(field.getFieldDescription()).append("'");
            }

            // 不在最后一个字段后面加逗号
            if (i < tableDTO.getFields().size() - 1) {
                createTableSQL.append(", ");
            }
        }

        // 添加通用字段
        createTableSQL.append(CommonFields.COMMON_FIELDS);

        // 去掉最后一个逗号并添加结束的括号
        //createTableSQL.setLength(createTableSQL.length()-2);

        // 如果有主键sql，添加到最后
        if (!primaryKeySQL.isEmpty()) {
            createTableSQL.append(", ").append(primaryKeySQL);
        }

        // 添加表的COMMENT
        if (tableDTO.getTableDescription()!=null&&!tableDTO.getTableDescription().isEmpty()) {
            createTableSQL.append(") COMMENT '").append(tableDTO.getTableDescription()).append("';");
        }else{
            createTableSQL.append(");");
        }

        // 执行sql创建表
        try(Connection connection=dataSource.getConnection()){
            try(Statement statement=connection.createStatement()){
                statement.execute(createTableSQL.toString());
                log.info("执行SQL创建表成功：{}", createTableSQL.toString());
            }

        } catch (SQLException se) {
            log.error("执行sql创建表失败：{}",se.getMessage());
            throw new RuntimeException("Error creating table: " + se.getMessage(), se);
        }
    }

}


